package org.adream.account.util;

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class WaterMarkUtil {
	
	/**
	 * 添加水印
	 * @param icon	水印图片
	 * @param source	源文件
	 * @param target	目标文件
	 * @param degree	旋转角度
	 */
	public static void markImageBySingleIcon(String icon, InputStream source, String target, Integer degree) {
		try {
			File ficon = new File(icon);
			// 将icon加载到内存中
			Image ic = ImageIO.read(ficon);
			// icon高度
			int icheight = ic.getHeight(null);
			int icwidth = ic.getWidth(null);
			// 将源图片读到内存中
			Image img = ImageIO.read(source);
			// 图片宽
			int width = img.getWidth(null);
			// 图片高
			int height = img.getHeight(null);
			BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			// 创建一个指定 BufferedImage 的 Graphics2D 对象
			Graphics2D g = bi.createGraphics();
			// x,y轴默认是从0坐标开始
			int x = (width / 2) - (icwidth / 2);
			int y = (height / 2) - (icheight / 2);
			// 设置对线段的锯齿状边缘处理
			g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
			// 呈现一个图像，在绘制前进行从图像空间到用户空间的转换
			g.drawImage(img.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
			if (null != degree) {
				// 设置水印旋转
				g.rotate(Math.toRadians(degree), (double) bi.getWidth() / 2, (double) bi.getHeight() / 2);
			}
			// 水印图象的路径 水印一般为gif或者png的，这样可设置透明度
			ImageIcon imgIcon = new ImageIcon(icon);
			// 得到Image对象。
			Image con = imgIcon.getImage();
			// 透明度，最小值为0，最大值为1
			float clarity = 0.6f;
			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, clarity));
			// 表示水印图片的坐标位置(x,y)
			g.drawImage(con, x, y, null);
			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
			g.dispose();
			File sf = new File(target);
			String ext = target.substring(target.lastIndexOf(".") + 1);
			ImageIO.write(bi, ext, sf); // 保存图片
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}